/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：登录通-系统通用工具封装层
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taiping.dlt.application.tools;

import com.taiping.dlt.application.constant.DefaultConstant;
import com.taiping.dlt.application.support.GenericTools;
import com.taiping.dlt.pojo.bo.AuthLoginBO;
import com.taipingframework.boot.session.constant.SessionCacheKeyEnum;
import com.taipingframework.boot.session.core.ReactiveSessionHandler;
//import com.taipingframework.boot.web.response.status.ApiStatusEnum;
import com.taipingframework.utility.context.SpringContextHolder;
//import com.taipingframework.utility.exception.SystemInterrupterException;
import com.taipingframework.utility.exception.UtilityException;
import org.springframework.lang.NonNull;
import reactor.core.publisher.Mono;

public class FluxSessionUserUtils {

    private static ReactiveSessionHandler reactiveSessionHandler;

    static {
        FluxSessionUserUtils.reactiveSessionHandler = SpringContextHolder.getBean(ReactiveSessionHandler.class);
    }

    /**
     * 获取当前登录账号名
     */
    public static Mono<AuthLoginBO> getCurrentVisitor() {
        return reactiveSessionHandler.readSession()
//        return ReactorHelper.getExchange()
//                .flatMap(ServerWebExchange::getSession)
//                .map(session -> {
//                    if (session.isStarted()) {
//                        return session;
//                    }
//                    throw new SystemInterrupterException(ApiStatusEnum.ERR_A0230);
//                })
                .map(session -> {
                    Object currentUserAttribute = session.getAttribute(SessionCacheKeyEnum.CURRENT_USER_INFO.getKey());
                    return GenericTools.convertAuthLoginFromObject(currentUserAttribute);
                })
                .onErrorResume(e -> Mono.error(new UtilityException(e)));
    }

    /**
     * 后端线程执行无状态的任务时，使用默认账户。
     */
    @NonNull
    public static Mono<AuthLoginBO> getDefaultVisitor() {
        return Mono.defer(() -> Mono.fromSupplier(() -> {
            AuthLoginBO authLoginBO = new AuthLoginBO();
            authLoginBO.setLoginId(DefaultConstant.LOGIN_ID);
            authLoginBO.setLoginName(DefaultConstant.LOGIN_NAME);
            return authLoginBO;
        }));
    }

}
